<!DOCTYPE html>
<html>
<head>
    

    

    
<!-- Baidu Tongji -->
<script>var _hmt = _hmt || []</script>
<script async src="//hm.baidu.com/hm.js?a7c05ce530152d9866930ef4850ee566"></script>
<!-- End Baidu Tongji -->




    <meta charset="utf-8">
    
    
    
    <title>深入Web请求过程(深入分析JavaWeb) | 神奇的鸭鸭の码农库 | 新知识要不断的总结记录成笔记，要多写，多画，能够清晰透彻的将知识讲给别人听，才是达到理解的层次。</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    
    <meta name="theme-color" content="#765959">
    
    
    <meta name="keywords" content="读书笔记">
    <meta name="description" content="笔记来源书籍：《深入分析 Java Web 技术内幕》 [作者：许令波] B/S 网络架构B/S 架构带来的好处： 客户端使用统一的浏览器(Browser)。由于浏览器具有统一性，不需要特殊的配置和网络连接，有效地屏蔽了不同服务提供商提供给用户使用服务的差异化。 服务端(Server)基于统一的HTTP。和传统的 C/S 架构使用之自定义的应用层协议不同，B/S 架构使用的都是统一的 HTTP，能">
<meta name="keywords" content="读书笔记">
<meta property="og:type" content="article">
<meta property="og:title" content="深入Web请求过程(深入分析JavaWeb)">
<meta property="og:url" content="http://magic_duck.oschina.io/2017/08/01/深入Web请求过程(读书)/index.html">
<meta property="og:site_name" content="神奇的鸭鸭の码农库">
<meta property="og:description" content="笔记来源书籍：《深入分析 Java Web 技术内幕》 [作者：许令波] B/S 网络架构B/S 架构带来的好处： 客户端使用统一的浏览器(Browser)。由于浏览器具有统一性，不需要特殊的配置和网络连接，有效地屏蔽了不同服务提供商提供给用户使用服务的差异化。 服务端(Server)基于统一的HTTP。和传统的 C/S 架构使用之自定义的应用层协议不同，B/S 架构使用的都是统一的 HTTP，能">
<meta property="og:updated_time" content="2017-10-21T09:41:56.918Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="深入Web请求过程(深入分析JavaWeb)">
<meta name="twitter:description" content="笔记来源书籍：《深入分析 Java Web 技术内幕》 [作者：许令波] B/S 网络架构B/S 架构带来的好处： 客户端使用统一的浏览器(Browser)。由于浏览器具有统一性，不需要特殊的配置和网络连接，有效地屏蔽了不同服务提供商提供给用户使用服务的差异化。 服务端(Server)基于统一的HTTP。和传统的 C/S 架构使用之自定义的应用层协议不同，B/S 架构使用的都是统一的 HTTP，能">
    
    <link rel="shortcut icon" href="/favicon.ico">
    <link rel="stylesheet" href="/css/style.css?v=1.4.3">
    <script>window.lazyScripts=[]</script>
</head>

<body>
    <div id="loading" class="active"></div>

    <aside id="menu" class="hide" >
  <div class="inner flex-row-vertical">
    <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light" id="menu-off">
        <i class="icon icon-lg icon-close"></i>
    </a>
    <div class="brand-wrap">
      <div class="brand">
        <a href="/" class="avatar waves-effect waves-circle waves-light">
          <img src="/img/avatar.jpg">
        </a>
        <hgroup class="introduce">
          <h5 class="nickname">神奇的鸭鸭</h5>
          <a href="mailto:702038338@qq.com" title="702038338@qq.com" class="mail">702038338@qq.com</a>
        </hgroup>
      </div>
    </div>
    <div class="scroll-wrap flex-col">
      <ul class="nav">
        
            <li class="waves-block waves-effect">
              <a href="/"  >
                <i class="icon icon-lg icon-home"></i>
                主页
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="/archives"  >
                <i class="icon icon-lg icon-archives"></i>
                归档
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="/tags"  >
                <i class="icon icon-lg icon-tags"></i>
                标签
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="https://git.oschina.net/magic_duck" target="_blank" >
                <i class="icon icon-lg icon-gg-circle"></i>
                码云
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="https://www.zhihu.com/people/shen-qi-de-ya-ya" target="_blank" >
                <i class="icon icon-lg icon-twitter"></i>
                知乎
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="/404.html"  >
                <i class="icon icon-lg icon-link"></i>
                404页面测试
              </a>
            </li>
        
      </ul>
    </div>
  </div>
</aside>

    <main id="main">
        <header class="top-header" id="header">
    <div class="flex-row">
        <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light on" id="menu-toggle">
          <i class="icon icon-lg icon-navicon"></i>
        </a>
        <div class="flex-col header-title ellipsis">深入Web请求过程(深入分析JavaWeb)</div>
        
        <div class="search-wrap" id="search-wrap">
            <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light" id="back">
                <i class="icon icon-lg icon-chevron-left"></i>
            </a>
            <input type="text" id="key" class="search-input" autocomplete="off" placeholder="输入感兴趣的关键字">
            <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light" id="search">
                <i class="icon icon-lg icon-search"></i>
            </a>
        </div>
        
        
        <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light" id="menuShare">
            <i class="icon icon-lg icon-share-alt"></i>
        </a>
        
    </div>
</header>
<header class="content-header post-header">

    <div class="container fade-scale">
        <h1 class="title">深入Web请求过程(深入分析JavaWeb)</h1>
        <h5 class="subtitle">
            
                <time datetime="2017-08-01T14:47:00.000Z" itemprop="datePublished" class="page-time">
  2017-08-01
</time>


            
        </h5>
    </div>

    

</header>


<div class="container body-wrap">
    
    <aside class="post-widget">
        <nav class="post-toc-wrap" id="post-toc">
            <h4>TOC</h4>
            <ol class="post-toc"><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#B-S-网络架构"><span class="post-toc-number">1.</span> <span class="post-toc-text">B/S 网络架构</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#B-S-架构带来的好处："><span class="post-toc-number">1.1.</span> <span class="post-toc-text">B/S 架构带来的好处：</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#B-S-架构概述"><span class="post-toc-number">1.2.</span> <span class="post-toc-text">B/S 架构概述</span></a></li></ol></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#如何发起一个请求"><span class="post-toc-number">2.</span> <span class="post-toc-text">如何发起一个请求</span></a></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#HTTP-解析"><span class="post-toc-number">3.</span> <span class="post-toc-text">HTTP 解析</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#浏览器缓存机制"><span class="post-toc-number">3.1.</span> <span class="post-toc-text">浏览器缓存机制</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-4"><a class="post-toc-link" href="#Cache-Control-Pragma"><span class="post-toc-number">3.1.1.</span> <span class="post-toc-text">Cache-Control/Pragma</span></a></li><li class="post-toc-item post-toc-level-4"><a class="post-toc-link" href="#Expires"><span class="post-toc-number">3.1.2.</span> <span class="post-toc-text">Expires</span></a></li><li class="post-toc-item post-toc-level-4"><a class="post-toc-link" href="#Last-Modified-Etag"><span class="post-toc-number">3.1.3.</span> <span class="post-toc-text">Last-Modified/Etag</span></a></li></ol></li></ol></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#DNS-域名解析"><span class="post-toc-number">4.</span> <span class="post-toc-text">DNS 域名解析</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#DNS-域名解析过程"><span class="post-toc-number">4.1.</span> <span class="post-toc-text">DNS 域名解析过程</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#跟踪域名解析过程"><span class="post-toc-number">4.2.</span> <span class="post-toc-text">跟踪域名解析过程</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#清除缓存的域名"><span class="post-toc-number">4.3.</span> <span class="post-toc-text">清除缓存的域名</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#几种域名解析方式"><span class="post-toc-number">4.4.</span> <span class="post-toc-text">几种域名解析方式</span></a></li></ol></li><li class="post-toc-item post-toc-level-2"><a class="post-toc-link" href="#CDN-工作机制"><span class="post-toc-number">5.</span> <span class="post-toc-text">CDN 工作机制</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#CDN-架构"><span class="post-toc-number">5.1.</span> <span class="post-toc-text">CDN 架构</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#负载均衡"><span class="post-toc-number">5.2.</span> <span class="post-toc-text">负载均衡</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#CDN动态加速"><span class="post-toc-number">5.3.</span> <span class="post-toc-text">CDN动态加速</span></a></li></ol></li></ol>
        </nav>
    </aside>
    
<article id="post-深入Web请求过程(读书)"
  class="post-article article-type-post fade" itemprop="blogPost">

    <div class="post-card">
        <h1 class="post-card-title">深入Web请求过程(深入分析JavaWeb)</h1>
        <div class="post-meta">
            <time class="post-time" title="2017年08月01日 22:47" datetime="2017-08-01T14:47:00.000Z"  itemprop="datePublished">2017-08-01</time>

            


            
<span id="busuanzi_container_page_pv" title="文章总阅读量" style='display:none'>
    <i class="icon icon-eye icon-pr"></i><span id="busuanzi_value_page_pv"></span>
</span>


            

        </div>
        <div class="post-content" id="post-content" itemprop="postContent">
            <p><strong>笔记来源书籍：《深入分析 Java Web 技术内幕》 [作者：许令波]</strong></p>
<h2 id="B-S-网络架构"><a href="#B-S-网络架构" class="headerlink" title="B/S 网络架构"></a>B/S 网络架构</h2><h3 id="B-S-架构带来的好处："><a href="#B-S-架构带来的好处：" class="headerlink" title="B/S 架构带来的好处："></a>B/S 架构带来的好处：</h3><ul>
<li><strong>客户端使用统一的浏览器(Browser)</strong>。由于浏览器具有统一性，不需要特殊的配置和网络连接，有效地屏蔽了不同服务提供商提供给用户使用服务的差异化。</li>
<li><strong>服务端(Server)基于统一的HTTP</strong>。和传统的 C/S 架构使用之自定义的应用层协议不同，B/S 架构使用的都是统一的 HTTP，能为服务提供商简化了开发流程，使得服务器开发者可以采用相对规范的开发模式，这样可以大大节省开发成本，由于使用统一的 HTTP，所以基于 HTTP 的服务器就有很多，如：Apache，IIS，Nginx，Tomcat，JBoss等，这些服务器可以直接拿来使用，不需要服务开发者单独来开发。</li>
</ul>
<h3 id="B-S-架构概述"><a href="#B-S-架构概述" class="headerlink" title="B/S 架构概述"></a>B/S 架构概述</h3><p>B/S 网络架构都基于统一的应用层协议 HTTP 来交互数据，与大多数传统 C/S 互联网应用程序采用的长连接的交互模式不同，HTTP采用无状态的短连接，通常情况下，一次请求就完成了一次数据交互，通常页对应一个业务逻辑，然后这次通信连接就断开了(前几天 SimpleCrm 项目中的 session 延迟关闭视乎违背了这点)，采用这种方式是为何同时服务更多用户，不可能每个用户访问一次就一直保持这个连接。</p>
<p>当一个用户在浏览器里输入 www.taobao.com 这个 URL 时，他会请求NDS把这个域名解析成对应的 IP 地址，然后根据这个 IP 地址在互联网找到相应的服务器，向这个服务器发起一个 get 请求，由这个服务器决定返回默认的数据资源给访问的用户。在服务器端实际还有很复杂的业务逻辑：服务器可能由多台，到底指定哪台处理请求，需要一个负载均衡设备来平均分配所有用户的请求；还有请求的数据是存储在分布式缓存里还是一个静态文件中，或是数据库里，当数据返回浏览器时，浏览器解析数据发现还有一些静态资源(css,js,img)又会发起另外的 HTTP 请求，而这些请求很可能会在 CDN 上，那么 CDN 服务器又会处理这个用户的请求。</p>
<p>现在的网络架构越来越复杂，但是始终有一些固定不变的原则需要遵守：</p>
<ul>
<li>互联网上所有资源都要用一个第一无二的 URL(统一资源定位符) 来表示。</li>
<li>必须基于 HTTP 与服务端交互。</li>
<li>数据展示(恢复容貌)必须在浏览器中进行。</li>
</ul>
<h2 id="如何发起一个请求"><a href="#如何发起一个请求" class="headerlink" title="如何发起一个请求"></a>如何发起一个请求</h2><p>发起一个 HTTP 请求的过程就是建立一个 Socket，但 outputStream.write 写入的二进制字节数据格式要符合 HTTP。浏览器在建立 Socket 连接之前，必须根据地址栏里输入的 URL 的域名 DNS 解析出 IP 地址，再根据这个地址和默认的80端口与服务器建立 Socket 连接，然后浏览器根据这个 URL 组装成一个 get 类型的 HTTP 请求头，通过 outputStream.write 发送到目标服务器，服务器等待 inputStream.read返回数据，最后断开这个连接。</p>
<ul>
<li><p>既然本质是 Socket 连接，那么我们完全可以模拟浏览器发起 HTTP 请求，例如使用 HttpClient ：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">HttpClient httpClient = <span class="keyword">new</span> HttpClient();</div><div class="line">PostMethod postMethod = <span class="keyword">new</span> PostMethod(<span class="string">"http://localhost:8080/SimpleCrm/"</span>);</div><div class="line"><span class="keyword">try</span> &#123;</div><div class="line">    <span class="keyword">int</span> statusCode = httpClient.executeMethod(postMethod);</div><div class="line">    <span class="keyword">if</span> (statusCode != HttpStatus.SC_OK) &#123;</div><div class="line">        System.err.println(<span class="string">"Method failed: "</span> + postMethod.getStatusLine());</div><div class="line">    &#125;</div><div class="line">    <span class="comment">//System.out.println(postMethod.getResponseBodyAsString()); </span></div><div class="line">&#125; <span class="keyword">catch</span> (Exception e) &#123;</div><div class="line">    e.printStackTrace();</div><div class="line">&#125; <span class="keyword">finally</span> &#123;</div><div class="line">        postMethod.releaseConnection(); </div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
<li><p>又例如 Linux 中的 curl 命令：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">返回页面的 HTML 数据：</div><div class="line">curl "http://localhost:8080/SimpleCrm/" </div><div class="line">查看访问的 HTTP 头信息：</div><div class="line">curl "http://localhost:8080/SimpleCrm/" -I</div></pre></td></tr></table></figure>
</li>
</ul>
<h2 id="HTTP-解析"><a href="#HTTP-解析" class="headerlink" title="HTTP 解析"></a>HTTP 解析</h2><p>B/S 网络架构的核心是 HTTP ，要理解 HTTP 最重要的就是熟悉 HTTP 中的 HTTP Header。它控制互联网上用户的数据传输，例如服务器没有用户请求的数据时会返回 404 状态码。</p>
<p>常见的 HTTP 请求头</p>
<table>
<thead>
<tr>
<th style="text-align:left">请求头</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Accept-Charset</td>
<td style="text-align:left">指定客户端接受的字符集</td>
</tr>
<tr>
<td style="text-align:left">Accept-Encoding</td>
<td style="text-align:left">指定客户端接受的内容编码</td>
</tr>
<tr>
<td style="text-align:left">Host</td>
<td style="text-align:left">指定被请求资源的 Internet 主机和端口号</td>
</tr>
<tr>
<td style="text-align:left">User-Agent</td>
<td style="text-align:left">告知服务器客户端的系统，浏览器和其他属性</td>
</tr>
<tr>
<td style="text-align:left">Connection</td>
<td style="text-align:left">当前连接是否保持</td>
</tr>
</tbody>
</table>
<p>常见的 HTTP 响应头</p>
<table>
<thead>
<tr>
<th style="text-align:left">响应头</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Server</td>
<td style="text-align:left">服务器名称</td>
</tr>
<tr>
<td style="text-align:left">Content-Type</td>
<td style="text-align:left">响应正文编码类型</td>
</tr>
<tr>
<td style="text-align:left">Content-Encoding</td>
<td style="text-align:left">告知浏览器服务端使用的压缩编码</td>
</tr>
<tr>
<td style="text-align:left">Content-Language</td>
<td style="text-align:left">描述资源所用的自然语言</td>
</tr>
<tr>
<td style="text-align:left">Content-Length</td>
<td style="text-align:left">指明实体正文的长度</td>
</tr>
<tr>
<td style="text-align:left">Keep-Alive</td>
<td style="text-align:left">保持连接的时间</td>
</tr>
</tbody>
</table>
<p>常见的 HTTP 状态码</p>
<table>
<thead>
<tr>
<th style="text-align:left">状态码</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">200</td>
<td style="text-align:left">客户端请求成功</td>
</tr>
<tr>
<td style="text-align:left">302</td>
<td style="text-align:left">临时跳转，地址通过Location指定</td>
</tr>
<tr>
<td style="text-align:left">400</td>
<td style="text-align:left">客户端请求语法有误，不能被服务器识别</td>
</tr>
<tr>
<td style="text-align:left">403</td>
<td style="text-align:left">服务器收到请求，但拒绝提供服务</td>
</tr>
<tr>
<td style="text-align:left">404</td>
<td style="text-align:left">请求的资源不存在</td>
</tr>
<tr>
<td style="text-align:left">500</td>
<td style="text-align:left">服务器发生不可预期错误</td>
</tr>
</tbody>
</table>
<h3 id="浏览器缓存机制"><a href="#浏览器缓存机制" class="headerlink" title="浏览器缓存机制"></a>浏览器缓存机制</h3><p>在我们浏览一个页面时发现异样时，通常考虑是不是浏览器做了缓存，一般通过按 ctrl+f5 重新请求一次这个页面，重新请求的页面肯定时最新的，因为这个操作会在 HTTP 的请求头中增加 Cache-Control:no-cache 与 Pragma:no-cache ，告知服务端我们要获取最新的数据而不是缓存(缓存服务器如 Varnish 代理)。</p>
<h4 id="Cache-Control-Pragma"><a href="#Cache-Control-Pragma" class="headerlink" title="Cache-Control/Pragma"></a>Cache-Control/Pragma</h4><p>用于指定所有缓存机制在整个请求/相应链中必须服从的指令，Cache-Control请求字段优先级高，和其他一些请求字段(Expires)同时出现时会覆盖其他字段，Pragma字段的作用和Cache-Control类似，能使相关服务器遵守该指令，该 HTTP Head字段有以下一些可选值：</p>
<table>
<thead>
<tr>
<th style="text-align:left">可选值</th>
<th style="text-align:left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Public</td>
<td style="text-align:left">所有内容都将被缓存，在响应头设置</td>
</tr>
<tr>
<td style="text-align:left">Private</td>
<td style="text-align:left">内容只缓存到私有缓存中，在响应头设置</td>
</tr>
<tr>
<td style="text-align:left">no-cache</td>
<td style="text-align:left">所有内容都不会被缓存，在相应头和请求头设置</td>
</tr>
<tr>
<td style="text-align:left">no-store</td>
<td style="text-align:left">所有内容都不会被缓存到缓存或 Internet 临时文件里，在响应头设置</td>
</tr>
<tr>
<td style="text-align:left">must-revalidation/proxy-revalidation</td>
<td style="text-align:left">如果缓存的内容失效，请求必须发送到服务器/代理进行重新验证，在请求头设置</td>
</tr>
<tr>
<td style="text-align:left">max-age=xxx</td>
<td style="text-align:left">缓存内容将在xxx秒后失效，只在 HTTP1.1 中可用，在响应头设置</td>
</tr>
</tbody>
</table>
<h4 id="Expires"><a href="#Expires" class="headerlink" title="Expires"></a>Expires</h4><p>格式：Expires: Sat, 25 Feb 1999 12:22:17 GMT，后面跟着一个日期和时间，超过这个时间值后，缓存的内容将失效，浏览器发出请求之前会检查这个页面的这个字段，查看是否过期。</p>
<h4 id="Last-Modified-Etag"><a href="#Last-Modified-Etag" class="headerlink" title="Last-Modified/Etag"></a>Last-Modified/Etag</h4><p>表示一个服务器上的资源的最后修改时间，资源可以是静态内容(加Last-Modified/Etag字段)或者动态内容，可以通过 Servlet 提供的 getLastModified 方法用于检查某个动态内容是否已经更新，可以判断当前请求的资源是否是最新的。</p>
<p>一般服务端在响应头返回这个字段，告知浏览器这个页面最后修改时间，浏览器再次请求时会加入If-Modified-Since字段询问当前缓存的页面是否时最新的，如果是服务器将返回304状态码。</p>
<h2 id="DNS-域名解析"><a href="#DNS-域名解析" class="headerlink" title="DNS 域名解析"></a>DNS 域名解析</h2><h3 id="DNS-域名解析过程"><a href="#DNS-域名解析过程" class="headerlink" title="DNS 域名解析过程"></a>DNS 域名解析过程</h3><p>当用户在浏览器输入 www.abc.com 时，DNS 解析将会有近10个步骤：</p>
<ul>
<li>1 检查浏览器缓存中有没有对应解析过的IP地址，如果有，解析过程结束，浏览器缓存域名是有限的，通常为几分钟到几个小时不等，可以通过 TTL 属性来设置。</li>
<li>2 如果用户的浏览器缓存没有，浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果，例如Linux中的/etc/hosts。</li>
<li>3 如果前两个步骤无法完成域名解析(本机)，就会请求真正的域名服务器来解析，在我们的网络配置里都会有 “DNS 服务器地址” 这一项，操作系统会将这个域名发送给这里设置的 LDNS(本地区域名服务器)，如果我们在学校接入网络，那么 DNS 服务器肯定在我们学校，如果时小区接入的，就时供应你互联网的应用提供商，即电信或联通 (SPA)，在linux下可以通过 cat /etc/resolv.conf 查询配置的 DNS Server ，大约80%的域名解析到这里就完成了，所以 LDNS 主要承担了域名的解析工作。</li>
<li>4 如果 LDNS 仍然没有命中，就直到Root Server域名服务器请求解析，目前互联网只有几个 NDS 根服务器。</li>
<li>5 根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server)。gTLD是国际顶级域名服务器，如.com .cn .org 等，全球只有13台左右。 </li>
<li>6 本地域名服务器再向上一步返回的 gTLD 服务器发送请求。</li>
<li>7 接受请求的 gTLD 服务器查找并返回此域名对应的 Name Server 域名服务器的地址，这个Name Server 就是通常就是你注册的域名服务器，例如你在某个域名服务提供商的申请的域名，那么这个域名解析任务就由这个域名提供商的服务器来完成。</li>
<li>8 Name Server 域名服务器会查询存储的域名和 IP 的映射关系表，在正常情况下都根据域名得到目标 IP 记录，连同一个 TTL 值返回给 Local DNS Server 域名服务器。</li>
<li>9 返回该域名对应的 IP 和 TTL 值， Local DNS Server 会缓存这个域名和 IP 的对应关系，缓存事件由 TTL 值控制。</li>
<li>10 把解析的结果返回给用户，用户根据 TTL 缓存在本地系统缓存中，域名解析过程结束。</li>
<li>在实际 DNS 解析过程中，可能更复杂，如 Name Server 也可能有多级，或者有一个 GTM 来负载均衡控制，都有可能会影响域名解析的过程。</li>
</ul>
<h3 id="跟踪域名解析过程"><a href="#跟踪域名解析过程" class="headerlink" title="跟踪域名解析过程"></a>跟踪域名解析过程</h3><p>在 Linux 下可以通过nslookup命令来查询域名解析结果：<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line">root@sqdyy-X555LI:~/git/Hexo/MyBlog# nslookup</div><div class="line"><span class="meta">&gt;</span> www.taobao.com</div><div class="line">Server:		???.?.?.?</div><div class="line">Address:	???.??.?.?#53</div><div class="line"></div><div class="line">Non-authoritative answer:</div><div class="line">www.taobao.com	canonical name = www.taobao.com.danuoyi.tbcache.com.</div><div class="line">Name:	www.taobao.com.danuoyi.tbcache.com</div><div class="line">Address: 183.61.241.???</div><div class="line">Name:	www.taobao.com.danuoyi.tbcache.com</div><div class="line">Address: 113.105.245.???</div><div class="line">Name:	www.taobao.com.danuoyi.tbcache.com</div><div class="line">Address: 121.10.25.??</div><div class="line">Name:	www.taobao.com.danuoyi.tbcache.com</div><div class="line">Address: 121.9.212.???</div></pre></td></tr></table></figure></p>
<p>还可以使用 dig 命令来查询 DNS 的解析过程(还可以添加+trace参数跟踪这个域名的解析过程)：<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div></pre></td><td class="code"><pre><div class="line">root@sqdyy-X555LI:~# dig www.taobao.com </div><div class="line">...</div><div class="line"></div><div class="line">; &lt;&lt;&gt;&gt; DiG 9.10.3-P4-Ubuntu &lt;&lt;&gt;&gt; www.taobao.com +trace</div><div class="line">;; global options: +cmd</div><div class="line">.			292430	IN	NS	b.root-servers.net.</div><div class="line">.			292430	IN	NS	h.root-servers.net.</div><div class="line">.			292430	IN	NS	i.root-servers.net.</div><div class="line">.			292430	IN	NS	m.root-servers.net.</div><div class="line">.			292430	IN	NS	g.root-servers.net.</div><div class="line">.			292430	IN	NS	k.root-servers.net.</div><div class="line">.			292430	IN	NS	a.root-servers.net.</div><div class="line">.			292430	IN	NS	e.root-servers.net.</div><div class="line">.			292430	IN	NS	f.root-servers.net.</div><div class="line">.			292430	IN	NS	j.root-servers.net.</div><div class="line">.			292430	IN	NS	d.root-servers.net.</div><div class="line">.			292430	IN	NS	l.root-servers.net.</div><div class="line">.			292430	IN	NS	c.root-servers.net.</div><div class="line">;; Received 811 bytes from 127.0.1.1#53(127.0.1.1) in 4 ms</div><div class="line"></div><div class="line">www.taobao.com.		57	IN	CNAME	www.taobao.com.danuoyi.tbcache.com.</div><div class="line">www.taobao.com.danuoyi.tbcache.com. 57 IN A	58.250.127.236</div><div class="line">www.taobao.com.danuoyi.tbcache.com. 57 IN A	163.177.20.223</div><div class="line">;; Received 109 bytes from 192.228.79.201#53(b.root-servers.net) in 3 ms</div></pre></td></tr></table></figure></p>
<h3 id="清除缓存的域名"><a href="#清除缓存的域名" class="headerlink" title="清除缓存的域名"></a>清除缓存的域名</h3><p>DNS域名解析后会缓存解析结果，其中主要在两个地方缓存结果，一个是Local DNS Server，另一个是本机，这两个缓存都是 TTL 值和本机缓存大小控制的，Local DNS Server的缓存时间是由 TTL 控制的，很难人工介入，但是我们可以清除本机的缓存，例如在Linux下可以通过以下指令清除缓存：<br><figure class="highlight shell"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">/etc/init.d/nscd restart</div></pre></td></tr></table></figure></p>
<p>在 Java 应用中 JVM 也会缓存 DNS 的解析结果，这个缓存是在 InetAddress 类中完成的，这个缓存的缓存时间有两种策略：一种时正确解析结果缓存，一种时失败解析结果缓存。这两个缓存时间由两个配置项控制，配置项是在 %JAVA_HOME%\lib\security\java.security 文件中配置的，分别是 networkaddress.cache.ttl 和 networkaddress.cache.negative.ttl ，它们默认值分别是-1(永不失效)和10(缓存10秒)。</p>
<p>要修改这两个值有几种方式，直接修改 java.security 文件中的默认值、在 Java 的启动参数正价 -Dsun.net.inetaddr.ttl=xxx 来修改默认值，通过 InetAddress 类动态修改。</p>
<p>如果使用 InetAddress 类解析域名，必须时单例涉及模式，不然会有验证的性能问题，如果每次都创建 InetAddress 实例，每一次都需要解析一次完整域名解析，会非常消耗时间。</p>
<h3 id="几种域名解析方式"><a href="#几种域名解析方式" class="headerlink" title="几种域名解析方式"></a>几种域名解析方式</h3><p>域名解析记录主要分为 A 记录、 MX 记录、CNAME 记录、NS 记录、TXT 记录。</p>
<ul>
<li>A 记录，A 代表的时 Address，用来指定域名对应的 IP 地址，A 记录可以将多个域名解析到一个 IP 地址，但是不能将一个域名解析到多个 IP 地址。</li>
<li>MX 记录，表示的是 Mail Exchange(邮件交换器)，可以将某一个域名下的邮件服务器指向自己的 Mail Server</li>
<li>CNAME 记录，全称是 Canonical Name(别名解析)。所谓的别名解析就是可以为一个域名设置一个或多个别名，如跟踪域名解析中的<br>“www.taobao.com. 193 IN    CNAME www.taobao.com.danuoyi.tbcache.com.” 就是 CNAME 解析</li>
<li>NS 记录，为某个域名指定 DNS 解析服务器，也就是这个域名有指定的 IP 地址的 DNS 服务器去解析，如跟踪域名解析中的”danuoyi.tbcache.com.    3298 IN NS danuoyins8.tbcache.com.”，就是 NX解析</li>
<li>TXT 记录，为某个主机或域名设置说明，如可以为 xulingbo.net 设置 TXT 记录为 “君山的博客|许令波(作者)” 这样的说明</li>
</ul>
<h2 id="CDN-工作机制"><a href="#CDN-工作机制" class="headerlink" title="CDN 工作机制"></a>CDN 工作机制</h2><p>CDN 就是内容分布网络(Content Delivery Network)，它时构筑在现有 Internet 上的一种先进的流量分配网络。其目的时通过在现有的 Internet 中增加一层新的网络架构，将网站的内容发布到最接近用户的网络”边缘“，使得用户可以就近取得内容，提高访问网站的响应速度，可以把它比喻为：CDN = 镜像(Mirror) + 缓存(Cache) + 整体负载均衡(GSLB)。因而，CDN可以提高 Internet 中信息流动的效率。</p>
<p>目前 CND 都以缓存网站中的静态数据为主，如CSS，JS，图片和静态页面等数据。用户从主站服务器请求到动态内容后，再从 CDN 上下载这些静态数据，从而家属网页数据内容的下载速度，通常来说 CDN 要达到以下几个目标：</p>
<ul>
<li>可扩展性(Scalability)。性能可扩展性：应对新增的大量数据、用户和事务的扩展能力。成本可扩展性：用低廉的运营成本提供动态的服务能力和高质量的内容分发</li>
<li>安全性(Security)。强调提供物物理设备、网络、软件、数据和服务过程的安全性，(趋势)减少因 DDoS 攻击或者其他而已行为造成商业网站的业务中断。</li>
<li>可靠性、响应和执行(Reliability、Responseiveness 和 Performance)。服务可用性指能够处理可能的故障和用户体验下降的问题，通过负载均衡及时提供网络的容错机制。</li>
</ul>
<h3 id="CDN-架构"><a href="#CDN-架构" class="headerlink" title="CDN 架构"></a>CDN 架构</h3><p>用户访问某一个静态文件(如 CSS 文件)，这个静态文件的域名假如时 cdn.taobao.com，那么首先要向 Local DNS 服务器发起请求，经过迭代解析后回到这个域名的注册服务器去解析，一般每个公司都会有一个 DNS 解析服务器。这个 DNS 解析服务器通常会把它重新 CNAME 解析到另一个域名，而这个域名最终会被指向 CDN 全局中的 DNS 负载均衡服务器，再由这个 GTM 来最终分配是哪个地方的访问用户，返回给离这个访问用户最近的 CDN 节点。拿到 DNS 解析结果，用户就直接去这个 CDN 节点访问这个静态文件了，如果这个节点所请求的文件不存在，就会再回到源站去获取这个文件，然后再返回给用户。</p>
<h3 id="负载均衡"><a href="#负载均衡" class="headerlink" title="负载均衡"></a>负载均衡</h3><p>负载均衡(Load Balance)就是对工作任务进行平衡、分摊到多个操作单元上执行，如图片服务器，应用服务器等共同完成工作任务，可以提高服务器响应熟读及利用效率，避免软件或者硬件模块出现单点失效，解决网络拥塞问题。通常有三种负载均衡：链路负载均衡、集群负载均衡、和操作系统负载均衡。这几种负载均衡不仅在 CDN 的集群中能使用，而且在 Web 服务或者分布式数据集群中同样能使用，但是在这些地方后两种使用的要多一些。</p>
<h3 id="CDN动态加速"><a href="#CDN动态加速" class="headerlink" title="CDN动态加速"></a>CDN动态加速</h3><p>CDN 的动态加速技术就是在 CDN 的 DNS 解析过程中通过动态的链路探测来寻找回源最好的一条路径，然后通过 DNS 的调度将所有请求调度到选定的这条路径上回源，从而加速用户访问的效率。</p>

        </div>

        <blockquote class="post-copyright">
    <div class="content">
        
<span class="post-time">
    最后更新时间：<time datetime="2017-10-21T09:41:56.918Z" itemprop="dateUpdated">2017年10月21日 17:41</time>
</span><br>


        如要转载请注明出处：<a href="/2017/08/01/深入Web请求过程(读书)/" target="_blank" rel="external">http://magic_duck.oschina.io/2017/08/01/深入Web请求过程(读书)/</a>
    </div>
    <footer>
        <a href="http://magic_duck.oschina.io">
            <img src="/img/avatar.jpg" alt="神奇的鸭鸭">
            神奇的鸭鸭
        </a>
    </footer>
</blockquote>

        
<div class="page-reward">
    <a id="rewardBtn" href="javascript:;" class="page-reward-btn waves-effect waves-circle waves-light">赏</a>
</div>



        <div class="post-footer">
            
	<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/读书笔记/">读书笔记</a></li></ul>


            
<div class="page-share-wrap">
    

<div class="page-share" id="pageShare">
    <ul class="reset share-icons">
      <li>
        <a class="weibo share-sns" target="_blank" href="http://service.weibo.com/share/share.php?url=http://magic_duck.oschina.io/2017/08/01/深入Web请求过程(读书)/&title=《深入Web请求过程(深入分析JavaWeb)》 — 神奇的鸭鸭の码农库&pic=http://magic_duck.oschina.io/img/avatar.jpg" data-title="微博">
          <i class="icon icon-weibo"></i>
        </a>
      </li>
      <li>
        <a class="weixin share-sns wxFab" href="javascript:;" data-title="微信">
          <i class="icon icon-weixin"></i>
        </a>
      </li>
      <li>
        <a class="qq share-sns" target="_blank" href="http://connect.qq.com/widget/shareqq/index.html?url=http://magic_duck.oschina.io/2017/08/01/深入Web请求过程(读书)/&title=《深入Web请求过程(深入分析JavaWeb)》 — 神奇的鸭鸭の码农库&source=" data-title=" QQ">
          <i class="icon icon-qq"></i>
        </a>
      </li>
      <li>
        <a class="facebook share-sns" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=http://magic_duck.oschina.io/2017/08/01/深入Web请求过程(读书)/" data-title=" Facebook">
          <i class="icon icon-facebook"></i>
        </a>
      </li>
      <li>
        <a class="twitter share-sns" target="_blank" href="https://twitter.com/intent/tweet?text=《深入Web请求过程(深入分析JavaWeb)》 — 神奇的鸭鸭の码农库&url=http://magic_duck.oschina.io/2017/08/01/深入Web请求过程(读书)/&via=http://magic_duck.oschina.io" data-title=" Twitter">
          <i class="icon icon-twitter"></i>
        </a>
      </li>
      <li>
        <a class="google share-sns" target="_blank" href="https://plus.google.com/share?url=http://magic_duck.oschina.io/2017/08/01/深入Web请求过程(读书)/" data-title=" Google+">
          <i class="icon icon-google-plus"></i>
        </a>
      </li>
    </ul>
 </div>



    <a href="javascript:;" id="shareFab" class="page-share-fab waves-effect waves-circle">
        <i class="icon icon-share-alt icon-lg"></i>
    </a>
</div>



        </div>
    </div>

    
<nav class="post-nav flex-row flex-justify-between">
  
    <div class="waves-block waves-effect prev">
      <a href="/2017/08/08/Maven_primary_01/" id="post-prev" class="post-nav-link">
        <div class="tips"><i class="icon icon-angle-left icon-lg icon-pr"></i> Prev</div>
        <h4 class="title">Maven快速入门</h4>
      </a>
    </div>
  

  
    <div class="waves-block waves-effect next">
      <a href="/2017/08/01/jQuery_primary_02/" id="post-next" class="post-nav-link">
        <div class="tips">Next <i class="icon icon-angle-right icon-lg icon-pl"></i></div>
        <h4 class="title">jQuery入门(二)</h4>
      </a>
    </div>
  
</nav>



    







</article>

<div id="reward" class="page-modal reward-lay">
    <a class="close" href="javascript:;"><i class="icon icon-close"></i></a>
    <h3 class="reward-title">
        <i class="icon icon-quote-left"></i>
        我只要一角钱~ ~
        <i class="icon icon-quote-right"></i>
    </h3>
    <ul class="reward-items">
        
        <li>
            <img src="/img/wechat.png" title="微信打赏二维码" alt="微信打赏二维码">
            <p>微信</p>
        </li>
        

        
        <li>
            <img src="/img/alipay.jpg" title="支付宝打赏二维码" alt="支付宝打赏二维码">
            <p>支付宝</p>
        </li>
        
    </ul>
</div>



</div>

        <footer class="footer">
    <div class="top">
        
<p>
    <span id="busuanzi_container_site_uv" style='display:none'>
        站点总访客数：<span id="busuanzi_value_site_uv"></span>
    </span>
    <span id="busuanzi_container_site_pv" style='display:none'>
        站点总访问量：<span id="busuanzi_value_site_pv"></span>
    </span>
</p>


        <p>
            <span><a href="" target="_blank" class="rss" title="rss"><i class="icon icon-lg icon-rss"></i></a></span>
            <span>博客内容遵循 <a href="http://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">知识共享 署名 - 非商业性 - 相同方式共享 4.0协议</a></span>
        </p>
    </div>
    <div class="bottom">
        <p>
            <span>Power by <a href="http://hexo.io/" target="_blank">Hexo</a> Theme <a href="https://git.oschina.net/z77z" target="_blank">邹海清</a></span>
            <span>神奇的鸭鸭の码农库 &copy; 2017</span>
        </p>
    </div>
</footer>

    </main>
    <div class="mask" id="mask"></div>
<a href="javascript:;" id="gotop" class="waves-effect waves-circle waves-light"><span class="icon icon-lg icon-chevron-up"></span></a>



<div class="global-share" id="globalShare">
    <ul class="reset share-icons">
      <li>
        <a class="weibo share-sns" target="_blank" href="http://service.weibo.com/share/share.php?url=http://magic_duck.oschina.io/2017/08/01/深入Web请求过程(读书)/&title=《深入Web请求过程(深入分析JavaWeb)》 — 神奇的鸭鸭の码农库&pic=http://magic_duck.oschina.io/img/avatar.jpg" data-title="微博">
          <i class="icon icon-weibo"></i>
        </a>
      </li>
      <li>
        <a class="weixin share-sns wxFab" href="javascript:;" data-title="微信">
          <i class="icon icon-weixin"></i>
        </a>
      </li>
      <li>
        <a class="qq share-sns" target="_blank" href="http://connect.qq.com/widget/shareqq/index.html?url=http://magic_duck.oschina.io/2017/08/01/深入Web请求过程(读书)/&title=《深入Web请求过程(深入分析JavaWeb)》 — 神奇的鸭鸭の码农库&source=" data-title=" QQ">
          <i class="icon icon-qq"></i>
        </a>
      </li>
      <li>
        <a class="facebook share-sns" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=http://magic_duck.oschina.io/2017/08/01/深入Web请求过程(读书)/" data-title=" Facebook">
          <i class="icon icon-facebook"></i>
        </a>
      </li>
      <li>
        <a class="twitter share-sns" target="_blank" href="https://twitter.com/intent/tweet?text=《深入Web请求过程(深入分析JavaWeb)》 — 神奇的鸭鸭の码农库&url=http://magic_duck.oschina.io/2017/08/01/深入Web请求过程(读书)/&via=http://magic_duck.oschina.io" data-title=" Twitter">
          <i class="icon icon-twitter"></i>
        </a>
      </li>
      <li>
        <a class="google share-sns" target="_blank" href="https://plus.google.com/share?url=http://magic_duck.oschina.io/2017/08/01/深入Web请求过程(读书)/" data-title=" Google+">
          <i class="icon icon-google-plus"></i>
        </a>
      </li>
    </ul>
 </div>


<div class="page-modal wx-share" id="wxShare">
    <a class="close" href="javascript:;"><i class="icon icon-close"></i></a>
    <p>扫一扫，分享到微信</p>
    <img src="//api.qrserver.com/v1/create-qr-code/?data=http://magic_duck.oschina.io/2017/08/01/深入Web请求过程(读书)/" alt="微信分享二维码">
</div>




    <script src="//cdn.bootcss.com/node-waves/0.7.4/waves.min.js"></script>
<script>
var BLOG = { ROOT: '/', SHARE: true, REWARD: true };



lazyScripts.push('//s95.cnzz.com/z_stat.php?id=1261081671&web_id=1261081671')

</script>

<script src="/js/main.min.js?v=1.4.3"></script>


<div class="search-panel" id="search-panel">
    <ul class="search-result" id="search-result"></ul>
</div>
<template id="search-tpl">
<li class="item">
    <a href="{path}" class="waves-block waves-effect">
        <div class="title ellipsis" title="{title}">{title}</div>
        <div class="flex-row flex-middle">
            <div class="tags ellipsis">
                {tags}
            </div>
            <time class="flex-col time">{date}</time>
        </div>
    </a>
</li>
</template>

<script src="/js/search.min.js?v=1.4.3" async></script>






<script async src="//dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>


</body>
</html>
